package br.com.dataphonebr.dao.impl;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import br.com.dataphonebr.entity.Usuario;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
 
public class UsuarioDao extends GenericDaoImpl<Usuario> {
	
	private final String CODIGO = "codigo";
	private final String NOME = "nome";
	private final String LOGIN = "login";
	private final String SENHA = "senha";
	private final String EMAIL = "email";
	private final String ATIVO = "ativo";
	private final String TELEFONE = "telefone";
	
	public UsuarioDao(Context context) {
		super(context);
	}
	
	@Override
	public String getTableName() {
		return "USUARIO";
	}

	@Override
	public String getColumnHack() {
		return CODIGO;
	}

	@Override
	public ContentValues getContentValues(Usuario entity) {
		ContentValues usuarioValues = new ContentValues();
		usuarioValues.put(CODIGO, entity.getCodigo());
		usuarioValues.put(NOME, entity.getNome());
		usuarioValues.put(EMAIL, entity.getEmail());
		usuarioValues.put(LOGIN, entity.getLogin());
		usuarioValues.put(SENHA, entity.getPassword());
		usuarioValues.put(ATIVO, entity.getEnabled());
		usuarioValues.put(TELEFONE, entity.getPhoneNumber());
		return usuarioValues;
	}

	@Override
	public String getScriptCreateTable() {
		StringBuffer query = new StringBuffer();
		query.append(" CREATE TABLE IF NOT EXISTS ");
		query.append(getTableName());
		query.append(" ( ");
		query.append(CODIGO).append(" INTEGER PRIMARY KEY AUTOINCREMENT,");
		query.append(NOME).append(" TEXT not null,");
		query.append(EMAIL).append(" TEXT not null, ");
		query.append(LOGIN).append(" TEXT not null,");
		query.append(SENHA).append(" TEXT not null, ");
		query.append(ATIVO).append(" boolean not null default true, ");
		query.append(TELEFONE).append(" TEXT ");
		query.append(" ); ");
		return query.toString();
	}
	
	public Cursor selectByName(String nome){
		StringBuffer query = new StringBuffer();
		query.append(" SELECT * FROM ");
		query.append(getTableName());
		query.append(" WHERE ");
		query.append(" UPPER(nome) like '% ").append(nome).append("%'");
		query.append(" ORDER BY nome");
		return getReadableDatabase().rawQuery(query.toString(), null);
	}
	
	public List<Usuario> selectAllByStatus(Boolean status){
		List<Usuario> usuarios = this.selectAll();
		List<Usuario> novosUsuarios = new ArrayList<Usuario>();
		if (usuarios != null && !usuarios.isEmpty()){
			for (Usuario usuario : usuarios){
				if (usuario.getEnabled().equals(status)){
					novosUsuarios.add(usuario);
				}
			}
		}
		return novosUsuarios;
	}	

	public Usuario selectByLoginAndStatus(String login, Boolean enabled){
		Usuario usuario = this.selectByLogin(login);
		if (usuario != null && usuario.getEnabled().equals(enabled)){
			return usuario;
		}
		return null;
	}
	
	public Usuario selectByLogin(String login){
		StringBuffer query = new StringBuffer();
		query.append(" SELECT * FROM ");
		query.append(getTableName());
		query.append(" WHERE ");
		query.append(" UPPER(login) = '").append(login.toUpperCase()).append("'");
		Cursor cursor = getReadableDatabase().rawQuery(query.toString(), null);
		if (cursor != null){
			List<Usuario> usuarios = cursorToList(cursor);
			if (usuarios != null && !usuarios.isEmpty()){
				return usuarios.get(0);
			}
		}
		return null;
	}
	
	public Usuario selectByEmail(String email){
		StringBuffer query = new StringBuffer();
		query.append(" SELECT * FROM ");
		query.append(getTableName());
		query.append(" WHERE ");
		query.append(" LOWER(email) = '").append(email.toLowerCase()).append("'");
		Cursor cursor = getReadableDatabase().rawQuery(query.toString(), null);
		if (cursor != null){
			List<Usuario> usuarios = cursorToList(cursor);
			if (usuarios != null && !usuarios.isEmpty()){
				return usuarios.get(0);
			}
		}
		return null;
	}
	
	@Override
	protected String getScriptCreateIndex() {
		StringBuffer script = new StringBuffer();
		script.append(createIndex(NOME, true));
		script.append(createIndex(LOGIN, true));
		return script.toString();
	}

	@Override
	protected String getScriptForeignKey() {
		return null;
	}
	
	@Override
	public List<Usuario> selectAll() {
		return sortByName(super.selectAll());
	}
	
	public List<Usuario> sortByName(List<Usuario> list){
		if (list != null && !list.isEmpty()){
			Comparator<Usuario> comparatorName = new Comparator<Usuario>() {
				@Override
				public int compare(Usuario lhs, Usuario rhs) {
					return lhs.getNome().compareToIgnoreCase(rhs.getNome());
				}
			};
			Collections.sort(list, comparatorName);
			
			Comparator<Usuario> comparatorEnabled = new Comparator<Usuario>() {
				@Override
				public int compare(Usuario lhs, Usuario rhs) {
					return rhs.getEnabled().compareTo(lhs.getEnabled());
				}
			};
			Collections.sort(list, comparatorEnabled);
		}
		return list;
	}

	@Override
	protected Usuario cursorToEntity(Cursor cursor) {
		Long id = cursor.getLong(0);
		String nome = cursor.getString(1);
		String email = cursor.getString(2);
		String login = cursor.getString(3);
		String senha = cursor.getString(4);
		boolean ativo = getBooleanValueFromCursor(cursor.getString(5));
		String telefone = cursor.getString(6);
		Usuario usuario = new Usuario(id, nome, email, login, senha, ativo, telefone);
		return usuario;
	}

	@Override
	public String getAlterTableScript() {
		// TODO Auto-generated method stub
		return null;
	}
}
